package dao;

import java.util.ArrayList;
import java.util.List;

import hibernate.HibernateUtil;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import dto.EmpleadoDTO;
import entity.Caja;
import entity.Cajero;
import entity.DSucursal;
import entity.Mesa;
import entity.MesaSimple;
import entity.Sucursal;

public class SucursalDAO {

	private static SucursalDAO instancia = null;
	private static SessionFactory sf = null;
	
	private SucursalDAO(){
		sf = HibernateUtil.getSessionFactory();
	}
	
	public static SucursalDAO getInstancia(){
		if(instancia == null)
			instancia = new SucursalDAO();
		return instancia;
	}

	 public Sucursal buscarSucursalNombre(String nombre) {
		
		Session s = null;
		Sucursal result = null;
		try{
			s = sf.getCurrentSession();
			Transaction t = s.beginTransaction();
			
			Query q = s.createQuery("from Sucursal s where s.nombre = :identificador");
			q.setParameter("identificador", nombre);
			result = (Sucursal) q.uniqueResult();
			t.commit();
		}catch(Exception e){
			System.out.println(e);
			System.out.println("ErrorDAO: SucursalDAO.buscarSucursalNombre");
		}
		
		return result;
	}

	 public void altaSucursal(Sucursal s){
		
		try{
			/*Abro sesion y grabo el objeto*/
			Session session = sf.openSession();
			session.beginTransaction();
			session.save(s);
			session.flush();
			session.getTransaction().commit();
			session.close();
		}catch(Exception e){
			System.out.println(e);
			System.out.println("ErrorDAO: Error al Insertar Sucursal");
		}
	 }

	public void merge(Sucursal suc) {
			Transaction t = null;
			Session s = sf.getCurrentSession();
			try {
				t = s.beginTransaction();

				s.merge(suc);
				t.commit();
				
			} catch (Exception e) {
				t.rollback();
				System.out.println(e);
				System.out.println("ErrorDAO: Merge Sucursal");
			}
		}

	public List<Sucursal> listarSucursales() {
		Session s = null;
		List<Sucursal> lista = null;
		
		try{
			s = sf.getCurrentSession();
			Transaction t = s.beginTransaction();
			
			lista = s.createQuery("from Sucursal").list();
			t.commit();
			
		}catch(Exception e){
			System.out.println(e);
			System.out.println("ErrorDAO: SucursalDAO.ListarSucursales");
		}
		
		return lista;
	}

	public void actualizarHsProduccion(Sucursal suc) {
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Update Sucursal s set s.hsDisponiblesProduccion = :hs "
					+ "where s.nombre = :nombre");
			q.setParameter("hs", suc.getHsDisponiblesProduccion());
			q.setParameter("nombre", suc.getNombre());
			
			q.executeUpdate();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: actualizarHsProduccionl");
		}
		
	}

	public DSucursal buscarDSucursalUsuario(String legajo) {
		DSucursal result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select s.deposito from Sucursal s inner join s.empleado e where e.legajo = :legajo");
			q.setParameter("legajo", legajo);
			
			result = (DSucursal) q.uniqueResult();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarDSucursalUsuario");
		}
		
		return result;
	}

	public Sucursal buscarSucursalEmpleado(EmpleadoDTO emp) {
		Sucursal result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select s from Sucursal s inner join s.salon sal inner join sal.sectores sec "
			+ "inner join sec.mozos m where m.legajo = :legajo");
			q.setParameter("legajo", emp.getLegajo());
			
			result = (Sucursal) q.uniqueResult();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarSucursalEmpleado");
		}
		
		return result;
	}

	public Sucursal buscarSucursalEmpleadoCocina(EmpleadoDTO emp) {
		Sucursal result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select s from Sucursal s inner join s.cocina c where c.empleado.legajo = :legajo");
			q.setParameter("legajo", emp.getLegajo());
			
			result = (Sucursal) q.uniqueResult();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarSucursalEmpleadoCocina");
		}
		
		return result;
	}

	public Sucursal buscarSucursalEmpleadoBarra(EmpleadoDTO emp) {
		Sucursal result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select s from Sucursal s inner join s.barra c where c.empleado.legajo = :legajo");
			q.setParameter("legajo", emp.getLegajo());
			
			result = (Sucursal) q.uniqueResult();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarSucursalEmpleadoBarra");
		}
		
		return result;
	}

	public Sucursal buscarSucursalEmpleadoCafeteria(EmpleadoDTO emp) {
		Sucursal result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select s from Sucursal s inner join s.cafeteria c where c.empleado.legajo = :legajo");
			q.setParameter("legajo", emp.getLegajo());
			
			result = (Sucursal) q.uniqueResult();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarSucursalEmpleadoBarra");
		}
		
		return result;
	}

	public Sucursal buscarSucursalCajero(EmpleadoDTO emp) {
		Sucursal result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select s from Sucursal s where s.empleado.legajo = :legajo");
			q.setParameter("legajo", emp.getLegajo());
			
			result = (Sucursal) q.uniqueResult();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarSucursalCajero");
		}
		
		return result;
	}

	public List<Mesa> buscarMesasSucursal(Sucursal suc) {
		List<Mesa> result = null;
		Transaction t = null;
		Session s = sf.getCurrentSession();
		try {
			t = s.beginTransaction();
			Query q = s.createQuery("Select m from Sucursal s inner join s.salon sa inner join sa.sectores sec "
					+ "inner join sec.mesas m where s.nombre = :nombre");
			q.setParameter("nombre", suc.getNombre());
			
			result = q.list();
			
			t.commit();
			
		} catch (Exception e) {
			t.rollback();
			System.out.println(e);
			System.out.println("ErrorDAO: buscarMesasSucurusal");
		}
		
		return result;
	}

}